#ifndef _JEU
#define _JEU

#include"Terrain.h"
#include"Joueur.h"

struct sJeu
{ 
	int niveau;
  	Terrain * lien_sur_terrain; 
  	int mode_jeu;
  	Joueur * tableau_de_joueurs; 
  	int tour;
  	int mapencours;
};
typedef struct sJeu Jeu;


/* Procédure : InitialisationJeu 
Précondition : jeu est déjà créé
Postcondition : initialise la structure Jeu, on alloue le terrain et la place pour deux joueurs dans le tas 
Paramètre en mode donnée-résultat : jeu */
void InitialisationJeu(Jeu * jeu);


/* Fonction : ObtientTerrainJeu -> Terrain
Précondition : j est bien initialisé
Postcondition : permet d'obtenir le Terrain de la structure Jeu.
                Ce Terrain peut etre modifier 
Paramètre en mode donnée-résultat : j */
Terrain * ObtientTerrainJeu(Jeu * j);


/* Fonction : ObtientTerrainConstJeu -> Terrain
Précondition : j est bien initialisé
Postcondition : permet d'obtenir le Terrain de la structure Jeu
	        Ce Terrain ne peut pas etre modifier 
Paramètre en mode donnée-résultat : j */
const Terrain * ObtientTerrainConstJeu(Jeu * j);


/* Procédure : RecherchePossibiliteDeplacement 
Précondition : j est bien initialisé, 0<=x<=(*t).dimx, 0<=y<=(*t).dimy (x et y correspondant à la localisation de l'unité)
Postcondition : est une procédure qui remplit un tableau d'entier qui permettra de savoir les possibilités de déplacement de l'unité. Dans un premier temps, on remplit le tableau qu'avec des 0 sauf à l'endroit où se trouve l'unité. Puis on complète le tableau selon l'état de chaque case du Terrain 
Paramètre en mode donnée-résultat : j, possibilite
Paramètre en mode donnée : x et y */
void RecherchePossibiliteDeplacement (Jeu * j, int * possibilite,int x, int y);


/* Procédure : ChangementTour 
Précondition : j est bien initialisé
Postcondition :  incrémente le champ "tour" de la structure Jeu
                 modifie le champ "utilise" de la structure Unite dans chaque case contenant une unité, et fait évoluer l'état de 
	         construction des maisons du Terrain 
Paramètre en mode donnée-résultat : j */
void ChangementTour(Jeu * j);


/* Procédure : DestructionJeu 
Précondition : j est bien initialisé
Postcondition : libère le Terrain après avoir détruit les éléments se trouvant dans celui-ci (Cases, Unite) 
Paramètre en mode donnée-résultat : j */
void DestructionJeu(Jeu *j);


/* Fonction : VerificationFinJeu -> entier
Précondition : j est bien initialisé
Postcondition : - renvoie 1 si le nombre d'unités de chaque joueur > 0
	        	- renvoie 0 sinon
Paramètre en mode donnée-résultat : j */
int VerificationFinJeu (Jeu * j);


/* Procédure : ChargementJeu 
Précondition : j est bien initialisé, nomfic existant
Postcondition : charge le fichier nomfic dans la structure Jeu 
Paramètre en mode donnée-résultat : j 
Paramètre en mode donnée : nomfic */
void ChargementJeu(Jeu * j, const char * nomfic);


/* Procédure SauvegardeJeu 
Précondition : j est bien initialisé, nomfic existant
Postcondition : sauvegarde la structure Jeu dans le fichier nomfic 
Paramètre en mode donnée : nomfic
Paramètre en mode donnée-résultat : j */
void SauvegardeJeu(Jeu * j, const char * nomfic);


/* Procédure : AjouterMaisonJeu 
Précondition : j est bien initialisé, 0<=x<=(*t).dimx, 0<=y<=(*t).dimy
Postcondition : ajoute une maison à la case x,y 
Paramètre en mode donnée : x, y selectionmaison 
Paramètre en mode donnée-résultat : j */
void AjouterMaisonJeu (Jeu * j, int selectionmaison, int x,int y);



/* Fonction de l'intelligence Artificielle */

/*  Procédure : RemplissageMap 
Précondition : j est bien initialisé, 0<=x<=(*t).dimx, 0<=x2<=(*t).dimx, 0<=y<=(*t).dimy, 0<=y2<=(*t).dimy, 1<=type<=3 
Postcondition : est une procédure qui a une double fonctionnalité :
	       1) Remplir un tableau d'entiers qui permettra de savoir où se trouve les éléments  (arbre, mer ou ennemis)
	       2) Remplir un tableau d'entiers qui permettra de savoir les possibilités de déplacement de l'unité.
	       Dans un premier temps, on remplit le tableau qu'avec des 0 sauf à l'endroit où se trouve l'unité.
	       Puis on complète le tableau selon l'état de chaque case du Terrain 
Paramètre en mode donnée : x, y, type, x2, y2
Paramètre en mode donnée-résultat : j, possibilite */
void RemplissageMap (Jeu * j, int * possibilite, int x, int y,int type,int x2, int y2);


/* Procédure : Radar 
Précondition : j est bien initialisé,  0<=x<=(*t).dimx, 0<=y<=(*t).dimy, 1<=type<=3 
Postcondition : permet avec l'aide de RemplissageMap de déplacer l'unité et de lui permettre de 
	        faire des actions (couper du bois, pecher, combattre)
Paramètre en mode donnée : x, y, type
Paramètre en mode donnée-résultat : j */
void Radar (Jeu * j, int x, int y, int type);


/* Procédure : IntelligenceArtificielle 
Précondition : j est bien initialisé
Postcondition : s'occupe de toutes les Unités de l'IA
	- Déplace les unités avec la procédure Radar
	- Construit les maisons 
	- Construit les unités 
Paramètre en mode donnée-résultat : j */
void IntelligenceArtificielle (Jeu * j);

/* Procédure VerificationMapFaite -> entier
Précondition : j est bien initialisé, nomfic est bien initialisé
Postcondition : si le fichier nomfic existe, on le lit et on vérifie que (*j).mapencours n'est pas
	présent dns le fichier. si il est présent, on fait rien, sinon on l'ajoute au fichier
				sinon on crée et on ajoute au fichier (*j).mapencours
Paramètre en mode donnée : nomfic
Paramètre en mode donnée-résultat : j */
int VerificationMapFaite(Jeu * j, const char * nomfic);

/* Procédure ChargementMapFaite
Précondition : j est bien initialisé, nomfic est bien initialisé
Postcondition : stocke tous les éléments du fichier nomfic dans tableaumap
Paramètre en mode donnée : nomfic
Paramètre en mode donnée-résultat : j, tableaumap*/
void ChargementMapFaite(Jeu * j,int tableaumap[8],const char * nomfic);

/* Procédure SauvegardeOption
Précondition : nomfic est bien initialisé
Postcondition : stocke musique, bruitage dans le fichier nomfic
Paramètre en mode donnée : nomfic musique bruitage */
void SauvegardeOption (int musique, int bruitage, const char * nomfic);

/* Procédure SauvegardeOption
Précondition : nomfic est bien initialisé
Postcondition : on récupère les éléments du ficheir nomfic dans musique et bruitage
Paramètre en mode donnée : nomfic 
Paramètre en mode donnée-résultat : musique, bruitage */
void ChargementOption (int * musique, int * bruitage, const char * nomfic);

/* Procédure VidageMapFaite
Précondition : nomfic est bien initialisé
Postcondition : vide le fichier nomfic */
void VidageMapFaite(const char * nomfic);

/* Procédure AjouterDecorEditeurJeu
Précondition : j est bien initialisé
Postcondition : on ajoute au terrain à la case x, y un décor de type selection
Paramètre en mode donnée : selection, x, y 
Paramètre en mode donnée-résultat : j */
void AjouterDecorEditeurJeu (Jeu * j, int selection, int x,int y);

/* Procédure AjouterUniteEditeurJeu
Précondition : j est bien initialisé
Postcondition : on ajoute au terrain à la case x, y une unité de type selection
Paramètre en mode donnée : selection, x, y 
Paramètre en mode donnée-résultat : j */
void AjouterUniteEditeurJeu (Jeu * j, int selection, int x,int y);

#endif
